#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#include "structure.h"
#include "primitives_structure.h"
#include "dpc.h"
#include "tests.h"
#include "graphe.h"

/**
 *  Fonction principale ou demarre le programme
 *
 *  Constantes pre-processeur (definie a la compilation):
 *
 *  	DOT: 		Generer le fichier de graphe des appels de DPC
 *
 * 	RECURSIF: 	Lance la resolution recursive
 * 	ITERATIF: 	Lance la resolution iterative
 *
 *  	H1: 		Active l'heuristique 1
 *  	H2: 		Active l'heuristique 2
 *  	H3: 		Active l'heuristique 3
 */
int main( int argc, char *argv[] ){

	int fichier, consistance;
	Formule *f;


	/**** GESTION DES ARGUMENTS ****/
	/* Si il y a un argument -h ou plus d'un */
	if( (argc==2 && !strcmp(argv[1],"-h")) || argc>2 ){

		printf("\nUsage:\n");
		printf("\t%s [fichier de formules de cardinalite]\n", argv[0]);
		printf("Si aucun fichier est specifie on lit les formules dans l'entree standard\n");

	/* Si un fichier est specifie */
	}else if(argc==2){

		/* on remplace l'entree standard par le fichier */
		if( (fichier = open(argv[1],O_RDONLY)) == -1 ){

			ERREUR2("Ne peut ouvrir le fichier \"%s\"", argv[1]);
			return 0;

		}

		if( dup2( fichier, fileno(stdin) ) == -1 ){

			ERREUR2("Ne peut rediriger le flux de \"%s\"", argv[1]);
			return 0;

		}

	}

	/**** CHARGEMENT DE LA FORMULE ****/
	/* lire la formule depuis l'entree et la stocker dans la structure Formule */
	f = chargerFormule( );


#ifdef DOT
	/* creation du fichier graphe */
	creerFichier( "graphe.dot" );
#endif


	/**** RESOLUTION ****/
#ifdef RECURSIF
#ifdef COUNT
	nbSolutions = 0;
#endif
	printf("\nResolution Recursive : ");
	start_clock();
	consistance = dpc( f );
	end_clock();
#endif

	
#if defined( ITERATIF ) || !defined( RECURSIF )
	
#ifdef COUNT
	nbSolutions = 0;
#endif
	
	printf("\nResolution Iterative : ");
	start_clock();
	consistance = dpcIteratif( f );
	end_clock();
		
#endif
	
#ifdef COUNT
	printf("Il y %i interpretation%s consistante%s\n", nbSolutions, (nbSolutions>0)?"s":"", (nbSolutions>0)?"s":"");
#else 
	/**** AFFICHAGE DU RESULTAT ****/
	if( consistance == CONSISTANT )
		printf("Cette formule est consistante!\n");
	else
		printf("Cette formule n'est pas consistante!\n");
#endif
	
		
		
#ifdef DOT
	/* on termine le graphe */
	terminerFichier();
#endif

	/**** LIBERATION ****/
	freeFormule( f );

	close(fichier);

	return 0;
}

